

"""
a=A() 这里先理解下函数参数里面的self和cls.这个self和cls是对类或者实例的绑定.对于实例方法,
我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self, x),
为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,
调用的时候是这样的a.foo(x)(其实是foo(a, x)).类方法一样,只不过它传递的是类而不是实例,A.class_foo(x).注意这里的self和cls可以替换别的参数,
但是python的约定是这俩,还是不要改的好. 对于静态方法其实和普通的方法一样,不需要对谁进行绑定,
唯一的区别是调用的时候需要使用a.static_foo(x)或者A.static_foo(x)来调用. 
实例方法 类方法 静态方法 a = A() a.foo(x) a.class_foo(x) a.static_foo(x) A 不可用 A.class_foo(x) A.static_foo(x)
"""

# python中的元类(metaclass)

"""Python自省
这个也是python彪悍的特性. 自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.
简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
"""

""" 迭代器和生成器
在Python中，这种一边循环一边计算的机制，称为生成器：generator。 可以被next()函数调用并不断返回下一个值的对象称为迭代器：Iterator。

这个是stackoverflow里python排名第一的问题,值得一看: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
"""

"""
-----------------------------*args-----------------------------
def pring_everything(*args):
    for i in args:
        print(i)                

pring_everything("1","2","3","4")

-----------------------------*KWargs-----------------------------
def table_things(**kwargs):
    for name, value in kwargs.items():
        print( '{0} = {1}'.format(name, value))

table_things(apple = 'fruit', cabbage = 'vegetable')
"""


"""面向切面编程AOP和装饰器
http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python 
中文: http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/3/README.html

"""


# --------------单例--------------
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance

class MyClass(Singleton):
    a = 1


"""
这个__new__确实很少见到,先做了解吧.
1.	__new__是一个静态方法,而__init__是一个实例方法.
2.	__new__方法会返回一个创建的实例,而__init__什么都不返回.
3.	只有在__new__返回一个cls的实例时后面的__init__才能被调用.
4.	当创建一个新实例时调用__new__,初始化一个实例时用__init__.
ps: __metaclass__是创建类时起作用.所以我们可以分别使用__metaclass__,__new__和__init__来分别在类创建,实例创建和实例初始化的时候做一些小手脚.
"""



"""  共享属性
创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
"""
class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
        ob = super(Borg, cls).__new__(cls, *args, **kw)
        ob.__dict__ = cls._state
        return ob

class MyClass2(Borg):
    a = 1   




"""
必须有一个内嵌函数
内嵌函数必须引用外部函数中的变量
外部函数的返回值必须是内嵌函数 感觉闭包还是有难度的,几句话是说不明白的,还是查查相关资料. 
    重点是函数运行后并不会被撤销,就像16题的instance字典一样,当函数运行完后,instance并不被销毁,
    而是继续留在内存空间里.这个功能类似类里的类变量,只不过迁移到了函数上. 
    闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.
"""



# is是对比地址,==是对比值



class A(object): 
    def go(self): 
        print ("go A go!" )
    def stop(self): 
        print ("stop A stop!")
    def pause(self): 
        raise Exception("Not Implemented")

class B(A): 
    def go(self): 
        super(B, self).go() 
        print ("go B go!")

class C(A): 
    def go(self): 
        super(C, self).go() 
        print ("go C go!" )
    def stop(self): 
        super(C, self).stop() 
        print ("stop C stop!")

class D(B,C): 
    def go(self): 
        super(D, self).go() 
        print ("go D go!" )
        
    def stop(self): 
        super(D, self).stop() 
        print ("stop D stop!" )
        
    def pause(self): 
        print ("wait D wait!")

class E(B,C): pass

a = A() 
b = B() 
c = C() 
d = D() 
e = E()

a.go() 
b.go() 
c.go() 
print("---------------------")
d.go() 
e.go()

a.stop() 
b.stop() 
c.stop() 
d.stop() 
e.stop()

a.pause() 
b.pause() 
c.pause() 
d.pause() 
e.pause()





"""    如何用Python来进行查询和替换一个文本字符串？

sub(replacement, string[, count=0])

"""


"""Post和Get区别
GET后退按钮/刷新无害，POST数据会被重新提交（浏览器应该告知用户数据会被重新提交）。 
GET书签可收藏，POST为书签不可收藏。 
GET能被缓存，POST不能缓存 。 
GET编码类型application/x-www-form-url，
POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 
GET历史参数保留在浏览器历史中。
POST参数不会保存在浏览器历史中。 
GET对数据长度有限制，当发送数据时，
GET 方法向 URL 添加数据；
URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。
POST无限制。 
GET只允许 ASCII 字符。
POST没有限制。也允许二进制数据。 与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。
在发送密码或其他敏感信息时绝不要使用 GET ！POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。 
GET的数据在 URL 中对所有人都是可见的。
POST的数据不会显示在 URL 中。
"""





"""    http  和  https
HTTPS（全称：Hypertext Transfer Protocol over Secure Socket Layer），是以安全为目标的HTTP通道，简单讲是HTTP的安全版。
即HTTP下加入SSL层，HTTPS的安全基础是SSL，因此加密的详细内容就需要SSL。 它是一个URI scheme（抽象标识符体系），句法类同http:体系。
用于安全的HTTP数据传输。https:URL表明它使用了HTTP，但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层（在HTTP与TCP之间）。
这个系统的最初研发由网景公司进行，提供了身份验证与加密通讯方法，现在它被广泛用于万维网上安全敏感的通讯，
例如交易支付方面。 超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则，
通过因特网传送万维网文档的数据传送协议。
"""